﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AccesoBD;
using LogicaNegocio;
using Entidades;

namespace PresentacionEscritorio
{
    public partial class frmRegistrarEspecialidad : Form, IOpcion
    {
        GestorEspecialdiad GE = new GestorEspecialdiad();
        GestorModalidadesAtencion GM = new GestorModalidadesAtencion();
        
        private string opElegida;
        public Especialidad EspObtenida { get; set; }

        public frmRegistrarEspecialidad()
        {
            InitializeComponent();
        }
        
        private void frmRegistrarEspecialidad_Load(object sender, EventArgs e)
        {
            GestorModalidadesAtencion Gm = new GestorModalidadesAtencion();
            lblError.Visible = false;
            chkHabilitarVigHasta.Checked = false;
            cargarModalidadesAtencion();
            cargarSegunOpcion();
        }

        private void cargarSegunOpcion()
        {
            switch (opElegida)
            {
                case Opcion.OpRegistrar:
                    dtpFechaHasta.Enabled = false;
                    btnAceptar.Text = "Registrar";
                    break;
                case Opcion.OpConsultar:
                    this.Text = "Consultar Especialidad - TodoSalud";
                    lblTitulo.Text = "Consultar especialidad: " + EspObtenida.Nombre;
                    txtNombreEspecialidad.Enabled = false;
                    txtDescripcionEspecialidad.Enabled = false;
                    txtDuracionAtencion.Enabled = false;
                    txtPrecioCobro.Enabled = false;
                    cmbTipoModalidad.Enabled = false;
                    dtpFechaDesde.Enabled = false;
                    dtpFechaHasta.Enabled = false;
                    chkHabilitarVigHasta.Visible = false;
                    cargarDatosEspecialidad();
                    btnAceptar.Text = "Aceptar";
                    break;
                case Opcion.OpModificar:
                    this.Text = "Modificar Especialidad - TodoSalud";
                    lblTitulo.Text = "Modificar especialidad:" + EspObtenida.Nombre;
                    txtNombreEspecialidad.Enabled = false;
                    cargarDatosEspecialidad();
                    btnAceptar.Text = "Modificar";
                    break;
                case Opcion.OpDarBaja:
                    this.Text = "Dar baja a Especialidad - TodoSalud";
                    lblTitulo.Text = "Dar Baja a especialidad: " + EspObtenida.Nombre;
                    txtNombreEspecialidad.Enabled = false;
                    txtDescripcionEspecialidad.Enabled = false;
                    txtDuracionAtencion.Enabled = false;
                    txtPrecioCobro.Enabled = false;
                    cmbTipoModalidad.Enabled = false;
                    dtpFechaDesde.Enabled = false;
                    dtpFechaHasta.Enabled = false;
                    chkHabilitarVigHasta.Visible = false;
                    cargarDatosEspecialidad();
                    btnAceptar.Text = "Dar de baja";
                    break;
            }
        }

        private void cargarDatosEspecialidad()
        {
            txtNombreEspecialidad.Text = EspObtenida.Nombre;
            txtDescripcionEspecialidad.Text = EspObtenida.Descripcion;
            txtPrecioCobro.Text = EspObtenida.PrecioLista.ToString();
            txtDuracionAtencion.Text = EspObtenida.ModalidadEspecialidad.DuracionAtencion.ToString();
            cmbTipoModalidad.SelectedValue = EspObtenida.ModalidadEspecialidad.CodTipoModalidad;
            dtpFechaDesde.Value = EspObtenida.ModalidadEspecialidad.FechaVigenciaDesde;
        }

        private void cargarModalidadesAtencion()
        {
            GestorModalidadesAtencion gm = new GestorModalidadesAtencion();
            List<TipoModalidad> listTipoModalidad = gm.ObtenerTipoModalidad();
            cmbTipoModalidad.DataSource = listTipoModalidad;
            cmbTipoModalidad.ValueMember = "CodTipoModalidad";
            cmbTipoModalidad.DisplayMember = "Nombre";
        }

        private bool validarDatos()
        {
            bool validacion = true;
            string error = "";
            if (string.IsNullOrEmpty(txtNombreEspecialidad.Text))
            {
                validacion = false;
                error += "El nombre de la especialidad es requerido\r\n";
            }
            if (string.IsNullOrEmpty(txtPrecioCobro.Text))
            {
                validacion = false;
                error += "El precio de la especialidad es requerido\r\n";
            }
            else
            {
                double p;
                bool resPrecio = double.TryParse(txtPrecioCobro.Text, out p);
                if (!resPrecio)
                {
                    validacion = false;
                    error += "El precio de la especialidad debe ser un valor numérico\r\n";
                }
            }
            if (string.IsNullOrEmpty(txtPrecioMedico.Text))
            {
                validacion = false;
                error += "El precio de la especialidad para el medico es requerido\r\n";
            }
            else
            {
                double p;
                bool resPrecio = double.TryParse(txtPrecioMedico.Text, out p);
                if (!resPrecio)
                {
                    validacion = false;
                    error += "El precio de la especialidad para el médico debe ser un valor numérico\r\n";
                }
            }
            if (cmbTipoModalidad.ValueMember == null)
            {
                validacion = false;
                error += "El tipo de modalidad de atencion debe seleccionarse\r\n";
            }
            if (string.IsNullOrEmpty(txtDuracionAtencion.Text))
            {
                validacion = false;
                error += "La duracion de la atencion es requerida\r\n";
            }
            else
            {
                int duracion;
                bool resDuracion = int.TryParse(txtDuracionAtencion.Text, out duracion);
                if (!resDuracion)
                {
                    validacion = false;
                    error += "La duracion de la atencion debe ser un valor numérico\r\n";
                }
            }
            if (dtpFechaDesde.Value <= DateTime.Now.Date)
            {
                validacion = false;
                error += "La fecha de vigencia desde debe ser una fecha igual o posterior al día de hoy\r\n";
            }
            if (chkHabilitarVigHasta.Checked)
            {
                if (dtpFechaHasta.Value < dtpFechaDesde.Value)
                {
                    validacion = false;
                    error += "La fecha de vigencia hasta debe ser una fecha posterior a la fecha de vigencia desde\r\n";
                }
            }
            if (error != "")
            {
                MessageBox.Show(error, "Aviso", MessageBoxButtons.OK);
            }
            return validacion;

        }
        
        private void Registrar()
        {
            if (validarDatos())
            {
                //tomamos datos la especialidad
                Especialidad esp = new Especialidad();
                esp.Nombre = txtNombreEspecialidad.Text;
                if (!string.IsNullOrEmpty(txtDescripcionEspecialidad.Text))
                    esp.Descripcion = txtDescripcionEspecialidad.Text;
                esp.PrecioLista = float.Parse(txtPrecioCobro.Text);
                esp.PrecioMedico = float.Parse(txtPrecioMedico.Text);
                esp.FechaAlta = DateTime.Now;
                
                //tomamos los datos de la modalidad de atencion y se lo asignamos a la especialidad
                ModalidadAtencion modAt = new ModalidadAtencion();
                modAt.CodTipoModalidad = int.Parse(cmbTipoModalidad.SelectedValue.ToString());
                modAt.DuracionAtencion = int.Parse(txtDuracionAtencion.Text);
                modAt.FechaVigenciaDesde = dtpFechaDesde.Value;
                if (chkHabilitarVigHasta.Checked == true && dtpFechaHasta.Value > DateTime.Now.Date)
                    modAt.FechaVigenciaHasta = dtpFechaDesde.Value;
                else
                    modAt.FechaVigenciaHasta = null;

                esp.ModalidadEspecialidad = modAt;
                
                //insertamos especialidad
                GestorEspecialdiad ge = new GestorEspecialdiad();
                int filasIns;
                ge.RegistrarEspecialidad(esp, out filasIns);
                if (filasIns > 0)
                {
                    MessageBox.Show("registro exitoso");
                    limpiarCampos();
                }
            }
        }

        private void limpiarCampos()
        {
            txtNombreEspecialidad.Text = null;
            txtDescripcionEspecialidad.Text = null;
            txtDuracionAtencion.Text = null;
            txtPrecioCobro.Text = null;
            cmbTipoModalidad.SelectedValue = -1;
            chkHabilitarVigHasta.Checked = false;
            dtpFechaDesde.Value = DateTime.Now;
            dtpFechaHasta.Value = DateTime.Now;
        }

        private void Modificar()
        {
            ModalidadAtencion modAtencionModif = null;
            Especialidad espModificada = null;
            if (validarDatos())
            {
                espModificada = new Especialidad();
                espModificada.Nombre = txtNombreEspecialidad.Text;
                espModificada.Descripcion = txtDescripcionEspecialidad.Text;
                espModificada.PrecioLista = float.Parse(txtPrecioCobro.Text);
                espModificada.PrecioMedico = float.Parse(txtPrecioMedico.Text);

                bool modalidadModificada = false;

                //vemos si se modifico o no 
                if (txtDuracionAtencion.Text != EspObtenida.ModalidadEspecialidad.DuracionAtencion.ToString())
                    modalidadModificada = true;
                if (cmbTipoModalidad.SelectedValue.ToString() == EspObtenida.ModalidadEspecialidad.CodTipoModalidad.ToString())
                    modalidadModificada = true;
                if (dtpFechaDesde.Value == EspObtenida.ModalidadEspecialidad.FechaVigenciaDesde)
                    modalidadModificada = true;
                if (dtpFechaHasta.Value == EspObtenida.ModalidadEspecialidad.FechaVigenciaHasta)
                    modalidadModificada = true;

                //si hay cambios creamos la nueva modalidad
                if (modalidadModificada)
                {
                    modAtencionModif = new ModalidadAtencion();
                    modAtencionModif.DuracionAtencion = int.Parse(txtDuracionAtencion.Text);
                    modAtencionModif.CodTipoModalidad = int.Parse(cmbTipoModalidad.SelectedValue.ToString());
                    modAtencionModif.FechaVigenciaDesde = dtpFechaDesde.Value;
                    modAtencionModif.FechaVigenciaHasta = dtpFechaHasta.Value;
                    
                    espModificada.ModalidadEspecialidad = modAtencionModif;

                    //va a desaparecer la vieja modalidad con fecha de baja ahora y ponerse la nueva, con la nueva modalidad
                    GestorEspecialidades.ModificarEspecialidad(espModificada, DateTime.Now);
                }
                else
                {
                    espModificada.ModalidadEspecialidad = EspObtenida.ModalidadEspecialidad;

                    //no va a desaparecer la vieja modalidad, por lo que no hay fecha de baja (vigencia hasta)
                    GestorEspecialidades.ModificarEspecialidad(espModificada);
                }
            }
        }
        
        //ver que en la baja despues se debe verificar si tiene medicos asignados y si tiene turnos dados a futuro
        private void DarBaja()
        {
            DialogResult result = MessageBox.Show("Desea dar de baja la especialidad " + EspObtenida.Nombre + "?", "Confirmar", MessageBoxButtons.YesNo);
            if (result.Equals(DialogResult.Yes))
            {
                bool res = GestorEspecialidades.RegistrarBajaEspecialidad(EspObtenida.CodEspecialidad, DateTime.Now);
                if (res)
                    MessageBox.Show("Se ha dado de baja exitosamente a la especialidad " + EspObtenida.Nombre);
                else
                    MessageBox.Show("No se ha podido dar de baja a la especialidad" + EspObtenida.Nombre);
            }
        }

        private void chkHabilitarVigHasta_CheckedChanged(object sender, EventArgs e)
        {
            if (chkHabilitarVigHasta.Checked)
                dtpFechaHasta.Enabled = true;
            else
                dtpFechaHasta.Enabled = false;
        }

        private void btnRegistrarEspecialidad_Click(object sender, EventArgs e)
        {
            switch (opElegida)
            {
                case Opcion.OpRegistrar:
                    Registrar();
                    break;
                case Opcion.OpModificar:
                    Modificar();
                    break;
                case Opcion.OpConsultar:
                    this.Dispose();
                    break;
                case Opcion.OpDarBaja:
                    DarBaja();
                    break;
            }
        }

        private void btnCancelarEspecialidad_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        public void setOpcion(string op)
        {
            opElegida = op;
        }

        public string getOpcion()
        {
            return opElegida;
        }
    }
}
